package top.eggcode.common.base;

import java.util.List;
import java.util.Optional;

/**
 * Title: 持久层基类接口
 * Description: TODO
 * Date: 2021/3/31 10:09
 *
 * @author JiaQi Ding
 * @version 1.0
 */
public interface SimpleStore<T> {

    /**
     * 查询一条数据
     *
     * @param id 主键
     * @return 实体
     */
    Optional<T> get(String id);

    /**
     * 查询所有
     *
     * @return 实体集合
     */
    List<T> selectAll();


    /**
     * 插入一条数据
     *
     * @param entity 实体
     */
    void add(T entity);

    /**
     * 批量插入
     *
     * @param entityList 实体集合
     */
    void batchAdd(List<T> entityList);

    /**
     * 更新数据
     * 只针对未被JPA容器管理的实体
     *
     * @param entity 实体
     */
    void update(T entity);

    /**
     * 批量更新
     *
     * @param entityList 实体集合
     */
    void batchUpdate(List<T> entityList);

    /**
     * 删除一条数据
     *
     * @param entity 实体
     */
    void delete(T entity);

    /**
     * 移除对象
     * 针对持久化对象
     *
     * @param entityList 实体集合
     */
    void batchDelete(List<T> entityList);


    /**
     * 自定义查询
     *
     * @param ql     JPQL语句
     * @param entity 实体类型
     * @return 实体集合
     */
    List<T> nativeQuery(String ql, Class<T> entity);

    /**
     * 自定义更新
     *
     * @param ql            JPQL语句
     * @param parameterList 参数列表
     * @return 影响记录数
     */
    int nativeUpdate(String ql, List<Object> parameterList);

    /**
     * 自定义删除
     *
     * @param ql            JPQL语句
     * @param parameterList 参数列表
     * @return 影响记录数
     */
    int nativeDelete(String ql, List<Object> parameterList);
}
